package com.yyx.qq.jobs;

import com.yyx.qq.QQMain;
import com.yyx.qq.R;
import com.yyx.qq.models.GroupType;
import com.yyx.qq.models.ModelUtils;
import com.yyx.qq.models.User;

import edu.tsinghua.lumaqq.qq.QQ;
import edu.tsinghua.lumaqq.qq.beans.QQFriend;
import edu.tsinghua.lumaqq.qq.events.QQEvent;
import edu.tsinghua.lumaqq.qq.packets.OutPacket;
import edu.tsinghua.lumaqq.qq.packets.in.GetFriendListReplyPacket;

/**
 * 
 * MyAndroidQQ com.yyx.qq.jobs
 * 
 * 获取好友列表的任务项
 * 
 * Filename: GetFriendListJob.java Description: Copyright: Copyright (c)2009
 * 
 * @author: 朱磊
 * @version: 1.0 Create at: 2009-9-14 下午12:11:14
 * @see
 */
public class GetFriendListJob extends AbstractJob {

	public void clear() {
		// TODO Auto-generated method stub
		main.getClient().removeQQListener(this);
	}

	public void prepare(QQMain m) {
		// TODO Auto-generated method stub
		super.prepare(m);
		main.getClient().addQQListener(this);
	}

	@Override
	public boolean isSuccess() {
		// TODO Auto-generated method stub
		return errorMessage != null;
	}

	@Override
	protected void preLoop() {
		// TODO Auto-generated method stub
		if (monitor != null) {
			monitor.beginTask("", 100);
			monitor.subTask(main.getText(R.string.job_get_friend_list)
					.toString());
		}

		main.getClient().user_GetList();
	}

	@Override
	protected void postLoop() {
		// TODO Auto-generated method stub
		main.getUiHelper().refreshAll();
		if (monitor != null)
			monitor.done();
	}

	/**
	 * 处理得到好友列表成功事件 我们得到每一个好友，
	 * 然后生成model对象，添加到总的model中 如果事件是get friend list
	 * end事件，还需要处理postponed message
	 */
	private void processGetFriendListSuccess(QQEvent e) {
		GetFriendListReplyPacket packet = (GetFriendListReplyPacket) e
				.getSource();
		for (QQFriend friend : packet.friends) {
			User u = ModelUtils.createUser(friend);
			main.getUiHelper().addUser(u, GroupType.DEFAULT_FRIEND_GROUP);
		}

		// 如果是得到好友列表结束事件，返回
		if (packet.position == QQ.QQ_POSITION_FRIEND_LIST_END) {
			wake();
		} else {
			main.getClient().user_GetList(packet.position);
		}
	}

	@Override
	public void qqEvent(QQEvent e) {
		// TODO Auto-generated method stub
		switch (e.type) {
		case QQEvent.FRIEND_GET_LIST_OK:
			processGetFriendListSuccess(e);
			break;
		case QQEvent.SYS_TIMEOUT:
			switch (e.operation) {
			case QQ.QQ_CMD_GET_FRIEND_LIST:
				processGetFriendListTimeout(e);
				break;
			}
			break;
		}
	}

	/**
	 * 处理得到好友列表超时事件，我们简单得重发超时的包
	 * 
	 * @param e
	 *            QQEvent
	 */
	private void processGetFriendListTimeout(QQEvent e) {
		main.getClient().sendPacket((OutPacket) e.getSource());
	}
}
